package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.service.system.DeptService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/dept")
@Slf4j // 生成log4j日志工具类的注解，相当于自动生成Log log = LogFactory.getLog(DeptController.class);
public class DeptController extends BaseController{

    @Autowired
    private DeptService deptService;

    // 记录日志的工具类
    // 为什么要用这个工具类？ 要往日志文件中记录程序执行的信息，项目部署的生产环境只能查看日志文件的信息。
    // 控制台的信息没法查看，因为被覆盖。
    //private Log log = LogFactory.getLog(DeptController.class);

    /**
     * 查询部门列表
     */
    @RequestMapping("/list")
    public String list(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "5") Integer pageSize) {
        try {
            log.info("执行部门分页的方法");

            // 企业id，从当前登陆用户哪里获取（先写死）
            String companyId = getLoginCompanyId();
            // 调用service查询
            PageInfo<Dept> pageInfo = deptService.findByPage(companyId, pageNum, pageSize);
            // 存储查询结果
            request.setAttribute("pageInfo", pageInfo);

            log.info("执行部门分页的方法 结束...");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("执行部门分页方法出现异常...",e);
        }
        return "system/dept/dept-list";
    }

    /**
     * 进入添加页面
     * http://localhost:8080/system/dept/toAdd
     */
    @RequestMapping("/toAdd")
    public String toAdd() {
        // 查询所有部门，作为上级部门下拉列表显示
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());
        request.setAttribute("deptList", deptList);
        return "system/dept/dept-add";
    }

    /**
     * 添加部门、修改部门
     */
    @RequestMapping("/edit")
    public String edit(Dept dept) {
        // 设置企业信息（先写死，后期从登陆用户动态获取）
        dept.setCompanyId(getLoginCompanyId());
        dept.setCompanyName(getLoginCompanyName());
        // 判断
        if (StringUtils.isEmpty(dept.getId())) {
            deptService.save(dept);
        } else {
            deptService.update(dept);
        }
        return "redirect:/system/dept/list";
    }

    /**
     * 进入修改页面
     * 1. 根据id查询，回显部门信息
     * 2. 查询所有部门，作为上级部门下拉列表
     */
    @RequestMapping("/toUpdate")
    public String toUpdate(String id) {
        // 根据id查询
        Dept dept = deptService.findById(id);

        // 查询所有部门
        List<Dept> deptList = deptService.findAll(getLoginCompanyId());

        // 保存
        request.setAttribute("dept", dept);
        request.setAttribute("deptList", deptList);
        return "system/dept/dept-update";
    }

    /**
     * 删除部门
     * 返回数据：{"message" : 1}
     */
    @RequestMapping("/delete")
    @ResponseBody  // 返回json字符串
    public Map<String, Integer> delete(String id) {
        Map<String, Integer> result = new HashMap<>();

        // 调用service删除
        boolean flag = deptService.delete(id);
        if (flag) {
            // 删除成功
            result.put("message", 1);
        } else {
            // 删除失败
            result.put("message", 0);
        }
        return result;
    }

}
